// 初始化列表
const nums1: number[] = [];
const nums2: number[] = [1, 5, 3, 9, 7];

// 列表本质上是数组
const num: number = nums2[1];
nums2[1] = 10;

nums2.push(6);
nums2.splice(3, 0, 7);  //在索引为3的位置插入元素7
nums2.splice(4, 1); //删除索引为4的元素

let count = 0;
for (let i = 0; i < nums2.length; i++) {
  count += nums2[i];
}
/**直接遍历列表元素 */
count = 0;
for (const num of nums2) {
  count += num;
}
// 拼接
nums1.push(...nums2);

// 列表排序
nums2.sort((a, b) => a - b);
console.log(nums2);
/**
 * 列表实现
 * 1.初始容量
 * 2.数据记录
 * 3.扩容机制
 */
class MyList {
  private arr: Array<number>;  //数组（存储列表元素）
  private _size: number = 0;  //列表长度
  private _capacity: number = 10;  //列表容量
  private extendRatio: number = 2;  //扩容系数

  /**
   * 构造方法
   */
  constructor() {
    this.arr = new Array(this._capacity);
  }

  /** 获取列表长度 */
  public size(): number {
    return this._size;
  }

  /**获取列表容量 */
  public capacity(): number {
    return this._capacity;
  }

  /** 访问元素 */
  public get(index: number): number {
    if (index < 0 || index >= this._size) {
      throw new Error('Index out of range');
    }
    return this.arr[index];
  }

  /** 修改元素 */
  public set(index: number, value: number): void {
    if (index < 0 || index > this._size) {
      throw new Error('Index out of range');
    }
    this.arr[index] = value;
  }

  /** 尾部添加元素 */
  public add(value: number): void {
    if (this._size >= this._capacity) {
      this.extend(); // 如果长度等于容量，则需要扩容
    }
    this.arr[this._size] = value;
    this._size++;
  }

  /** 中间插入元素 */
  public insert(index: number, value: number): void {
    if (index < 0 || index > this._size) {
      throw new Error('Index out of range');
    }
    if (this._size >= this._capacity) {
      this.extend(); // 如果长度等于容量，则需要扩容
    }
    for (let i = this._size - 1; i >= index; i--) {
      this.arr[i + 1] = this.arr[i];
    }
    this.arr[index] = value;
    this._size++;
  }

  /** 扩容 */
  public extend(): void {
    this.arr = this.arr.concat(new Array(this.capacity() * (this.extendRatio - 1)));
    this._capacity = this.arr.length;
  }

  /** 删除元素 */
  public remove(index: number): number {
    if (index < 0 || index >= this._size) {
      throw new Error('Index out of range');
    }
    const value = this.arr[index];
    //索引 index 之后的元素都向前移动一位
    for (let i = index; i < this._size - 1; i++) {
      this.arr[i] = this.arr[i + 1];
    }
    this._size--;
    return value;
  }

  /** 将列表转换数组 */
  public toArray(): Array<number> {
    // return this.arr.slice(0, this._size);
    let size = this._size;
    const arr = new Array(size);
    for (let i = 0; i < size; i++) {
      arr[i] = this.arr[i];
    }
    return arr;
  }
}